跳到主要内容

Java Netty 传输工具 ByteBuf

为什么需要 ByteBuf?

之前学习 NIO 的时候它使用了 ByteBuffer 来传输数据,那为什么 Netty 还要创建一个 ByteBuf 来传输数据呢?

主要是修复了一些 ByteBuffer 使用的痛点,下面是一些 ByteBuf API 的优点:

  • 它可以被用户自定义的缓冲区类型扩展
  • 通过内置的复合缓冲区类型实现了透明的零拷贝
  • 容量可以按需增长(类似于 JDK 的 StringBuilder)
  • 在读和写这两种模式之间切换不需要调用 ByteBuffer 的 flip() 方法
  • 读和写使用了不同的索引
  • 支持方法的链式调用
  • 支持引用计数
  • 支持池化

ByteBuf 切片

ByteBuf 切片是【零拷贝】的体现之一,对原始 ByteBuf 进行切片成多个 ByteBuf,切片后的 ByteBuf 并没有发生内存复制,还是使用原始 ByteBuf 的内存,切片后的 ByteBuf 维护独立的 read,write 指针

得到分片后的 buffer 后,要调用其 retain 方法,使其内部的引用计数加一。避免原 ByteBuf 释放,导致切片 buffer 无法使用

修改原 ByteBuf 中的值,也会影响切片后得到的 ByteBuf